package com.cskaoyan.javase.array._2memory;

/**
 *
 * 定义两个数组：
 * 静态初始化一个数组，输出数组名，元素取值，长度
 * 然后声明第二个数组，把第一个数组的地址赋值给第二个数组。
 * 输出第二个数组的数组名，元素取值，长度
 * 然后给第二个数组赋值，再次输出两个数组的名及元素
 *
 * @since 10:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo5 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        /*
            Java中的引用是非常安全的，可以看成功能弱化再弱化的指针
            一般来说只有相同类型的引用才可以做赋值
         */
        int[] arr2 = arr;
        double[] arr3 = new double[1];

        // arr和arr2中存储的地址是一致的,它们指向同一个对象
        System.out.println(arr);
        System.out.println(arr2);

        /*
            比较运算符,在比较引用数据类型时,可以用"=="或者"!="
            比较的是引用中存储的地址
            只有当两个引用中的地址一致,说白了就是指向同一个对象时,两个引用才是相等的
            这个条件是很苛刻的,说白了,只有自身对象才和自身对象相等
            指向同一个对象的多个引用,就相当于同一个人有本名,有花名,还有小名一样,都是指向同一个人

            但是要注意: 比较运算符比较引用时,前提是这个两个引用的数据类型一致
         */
        System.out.println(arr == arr2);
        // System.out.println(arr == arr3);
        // new关键字,一定要在堆上创建一个独立的,新的对象
        int[] arr4 = new int[2];
        System.out.println(arr == arr4);
        System.out.println(arr2 == arr4);

        arr[0] = 666;
        /*
            多个引用指向同一个对象
            用其中某个引用操作对象
            修改对象中元素的取值(我们把修改对象中元素的取值,称之为改变对象的状态)
            某个引用改变了对象的状态
            再用其他引用访问,这个对象已经改变了
         */
        System.out.println(arr2[0]);

        arr2[1] = 777;
        System.out.println(arr[1]);
    }
}
